package com.atguigu.team.service;

import com.atguigu.team.domain.Architect;
import com.atguigu.team.domain.Designer;
import com.atguigu.team.domain.Employee;
import com.atguigu.team.domain.Programmer;

/**
 * @author zjlmonster Email:m18856666525@163.com
 * @Description 关于开发团队成员的管理：添加、删除等
 * @date 2022年8月26日上午11:08:00
 */
public class TeamService {

    private static int counter = 1;// 用来为开发团队新增成员自动生成团队中的唯一ID
    private final int MAX_MEMBER = 5;// 表示开发团队最大成员数
    private Programmer[] team = new Programmer[MAX_MEMBER];// 用来保存当前团队中的各成员对象
    private int total;// 记录团队成员的实际人数

    public TeamService() {
        super();
    }

    /**
     * @return
     * @Description 获取开发团队中的所用成员
     * @author zjlmonster
     * @date 2022年8月26日上午11:20:38
     */
    public Programmer[] getTeam() {
        Programmer[] team1 = new Programmer[total];
        for (int i = 0; i < team1.length; i++) {
            team1[i] = this.team[i];
        }
        return team1;
    }

    /**
     * @param e
     * @throws TeamException
     * @Description
     * @author zjlmonster 将指定员工添加到开发团队中
     * @date 2022年8月26日下午9:37:59
     */
    public void addMember(Employee e) throws TeamException {
//		成员已满，无法添加
        if (total >= MAX_MEMBER) {
            throw new TeamException("成员已满，无法添加！");
        }
//		该成员不是开发人员，无法添加
        if (!(e instanceof Programmer)) {
            throw new TeamException("本成员不是开发人员！");
        }
//		该员工已在本开发团队中
        if (isExist(e)) {
            throw new TeamException("该员工已在本开发团队中！");
        }
//		该员工已是某团队成员
        Programmer p = (Programmer) e;
//		if ("BUSY".equals(p.getStatus().getNAME())) {// if(p.getStatus().getNAME().equals(Status.BUSY)) {
//			throw new TeamException("该员工已是某团队成员！");
//		}
////		该员正在休假，无法添加
//		if ("VOCATION".equals(p.getStatus().getNAME())) {
//			throw new TeamException("该员正在休假！");
//		}

        switch (p.getStatus()) {
            case BUSY:
                throw new TeamException("该员工已是某团队成员！");
            case VACATION:
                throw new TeamException("该员正在休假！");
        }

//		团队中至多只能有一名架构师		
//		团队中至多只能有两名设计师
//		团队中至多只能有三名程序员

        // 获取team已有成员中架构师，设计师，程序员的人数
        int numOfArch = 0, numOfDes = 0, numOfPro = 0;
        for (int i = 0; i < total; i++) {
            if (team[i] instanceof Architect) {
                numOfArch++;
            } else if (team[i] instanceof Designer) {
                numOfDes++;
            } else if (team[i] instanceof Programmer) {
                numOfPro++;
            }
        }

        if (p instanceof Architect) {
            if (numOfArch >= 1) {
                throw new TeamException("团队中至多只能有一名架构师！");
            }
        } else if (p instanceof Designer) {
            if (numOfDes >= 2) {
                throw new TeamException("团队中至多只能有两名设计师！");
            }
        } else if (p instanceof Programmer) {
            if (numOfPro >= 3) {
                throw new TeamException("团队中至多只能有三名程序员！");
            }
        }

        // 将p（或e）添加到现有的team中
        team[total++] = p;
        // p的属性赋值
        p.setStatus(Status.BUSY);
        p.setMemberld(counter++);
    }

    /***
     *
     * @Description 判断指定员工是否存在于现有团队中
     * @author zjlmonster
     * @date 2022年8月26日下午9:58:59
     * @param e
     * @return
     */
    private boolean isExist(Employee e) {
        for (int i = 0; i < total; i++) {
            if (team[i].getId() == e.getId()) {
                return true;
            }
        }
        return false;
    }

    /**
     * @param memberId
     * @throws TeamException
     * @Description 从团队中删除成员
     * @author zjlmonster
     * @date 2022年8月26日下午10:35:36
     */
    public void removeMember(int memberId) throws TeamException {
        int i = 0;
        for (; i < total; i++) {
            if (team[i].getMemberld() == memberId) {
                team[i].setStatus(Status.FREE);
                break;
            }
        }

        // 未找到指定memberId的情况
        if (i == total) {
            throw new TeamException("找不到指定memberId的员工，删除失败");
        }

        // 后一个元素覆盖前一个元素，实现删除操作
        for (int j = i + 1; j < total; j++) {
            team[j + 1] = team[j];
        }

        team[--total] = null;

    }

}
